最近補課的模式有了改變,大部分時間都是詩憶讀著講義,遇到問題或是想要學得更深入的時候再和唯心討論。
比如說現在詩憶剛讀完新的章節,打算進行歸納。
「學姐妳之前提過,程式進化是為了讓程式工程師更容易開發程式,那語法糖也可以算在內吧?」
「當然是呀。只是各家程式語言的語法糖都不一樣,所以也相對提高切換語言的門檻。」
「學姐還推薦學哪些程式語言呢——為了就業?」
「這個等妳順利通過這次考試後再告訴妳吧,現在來抽考一下妳對Kotlin語法糖的熟悉度。第一題,Scope functions
成員之間最大的兩個差異點是什麼?」唯心馬上提問。
詩憶從熱呼呼的記憶裡拉出答案。「函式裡面引用情境物件Context Object
的方式的和函式回傳值。」
「沒錯。第二題,引用的時候this
和it
的差異是什麼?」
「this
是Lambda Receiver
,it
是Lambda Argument
。」
「唔,雖然沒有錯,但我想要的答案不是這個。我想知道的是,兩者在引用方式時的差異,它們不是只有名字的差異吧?」
詩憶恍然大悟。「喔喔,妳是說這個。this
在Scope functions
的body
擁有主權,可以直接呼叫Context Object
的函式而不用帶前綴;it
則只是作為一個參數傳入body
。」詩憶信心十足地接著說。「我猜第三題就是考回傳值,函式回傳原本的Context Object
或是最後一個函式的結果。」
「不錯呢,都還記得很清楚。那Scope functions
分類也沒問題囉。」唯心將三種分類方式——引用情境物件、回傳值、函式是Extension Functions
——列在紙上遞給她。
詩憶依序填上答案。
引用情境物件:this
:.run
、with(x)
、.apply
it
:.let
、.also
回傳值:Lambda Result
:.let
、.run
、run
、with(x)
Context Object
:.apply
、.also
函式是Extension Functions
:.let
、.run
、.apply
、.also
「學姐,為什麼要特別歸類是不是Extension Functions
呢?」
「因為Extension Functions
比較適合Functional Programming
的設計風格。比起把物件當作參數傳入函式去做變化,Functional Programming
希望由物件呼叫函式,由函式引領變化,也比較容易編寫測試情境。」
//Extension Functions
drink.xxx()
//Other Functions
xxx(drink)
「唔,是這樣啊,也就是說不是所有程式語言都有Extension Functions
了?」
「嗯。不過程式語言之間也會互相學習,過去沒有的,現在也許也會開始支援,所以使用程式語言的時候也要注意使用的是哪個版本。」
「喔喔。」
「既然都說到這了,就出幾個Extension Functions
題目給妳吧!」
「咦——」